home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / string / strtod.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  2KB  |  116 lines

  1.  
  2. /*
  3.  *  STRTOD.C
  4.  *
  5.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  6.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  7.  *    DICE-LICENSE.TXT.
  8.  */
  9.  
  10. #include <string.h>
  11. #include <math.h>
  12.  
  13. double
  14. strtod(str, tp)
  15. const char *str;
  16. char **tp;
  17. {
  18.     char    prefix[32]; /*  prefix (precision)    */
  19.     char    c;
  20.     short   xp = -1;    /*  exponent    */
  21.     short   i;
  22.     short   j;
  23.     short   neg = 0;
  24.  
  25.     while (*str == ' ' || *str == 9)
  26.     ++str;
  27.     switch(*str) {
  28.     case '+':
  29.     ++str;
  30.     break;
  31.     case '-':
  32.     neg = 1;
  33.     ++str;
  34.     break;
  35.     }
  36.  
  37.     /*
  38.      *    skip any leading zeros, generate numerical prefix
  39.      */
  40.  
  41.     while (*str == '0')
  42.     ++str;
  43.     for (i = 0; (c = *str) >= '0' && c <= '9'; ++str) {
  44.     if (i < sizeof(prefix)) {
  45.         prefix[i] = c - '0';
  46.         ++i;
  47.     }
  48.     ++xp;
  49.     }
  50.  
  51.     /*
  52.      *    decimal point, continue generating prefix, exponent no longer grows
  53.      *    skip leading zeros
  54.      */
  55.  
  56.     if (*str == '.') {
  57.     while (i == 0 && *str == '0') {
  58.         --xp;
  59.         ++str;
  60.     }
  61.     for (++str; (c = *str) >= '0' && c <= '9'; ++str) {
  62.         if (i < sizeof(prefix)) {
  63.         prefix[i] = c - '0';
  64.         ++i;
  65.         }
  66.     }
  67.     }
  68.  
  69.     /*
  70.      *    exponent
  71.      */
  72.  
  73.     if (*str == 'e' || *str == 'E') {
  74.     long n = 0;
  75.     short xpneg = 0;
  76.  
  77.     ++str;
  78.     switch(*str) {
  79.     case '+':
  80.         ++str;
  81.         break;
  82.     case '-':
  83.         xpneg = 1;
  84.         ++str;
  85.         break;
  86.     }
  87.     while ((c = *str) >= '0' && c <= '9') {
  88.         n = n * 10 + c - '0';
  89.         ++str;
  90.     }
  91.     if (xpneg)
  92.         n = -n;
  93.     xp += n;
  94.     }
  95.  
  96.     if (tp)
  97.     *tp = str;
  98.  
  99.     /*
  100.      *    Generate number
  101.      */
  102.  
  103.     {
  104.     double d = 0.0;
  105.     for (j = 0; j < i; ++j) {
  106.         if (prefix[j])
  107.         d = d + (double)prefix[j] * pow(10.0, (double)xp);
  108.         --xp;
  109.     }
  110.     if (neg)
  111.         d = -d;
  112.     return(d);
  113.     }
  114. }
  115.  
  116.